package iks.render.anim 
{
	import flash.display.BitmapData;
	import iks.iface.IKDispose;
	
	/**
	 * 存储2D贴图纹理数据, 同时保存一个标识符, 帮助纹理缓存类管理纹理, 确保当前纹理是系统中唯一的, 避免重复内存使用.
	 * KTexture2D 类会释放其构造时保留的位图数据, 所以当释放 KTexture2D 类时, 保证已经没有对象会使用其位图数据.
	 * @author Yao Zhenyu
	 */
	public final class KTexture2D implements IKDispose
	{
		/**
		 * 构造函数
		 */
		public function KTexture2D(bitmapData : BitmapData, key : Object) 
		{
			if (bitmapData == null || key == null)
				throw new ArgumentError("KTexture2D: 构造函数, 参数不能为null.");
			
			m_bitmapData = bitmapData;
			m_key = key;
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 公共域
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		/// 存储的位图数据
		public function get bitmapData() : BitmapData
		{
			return m_bitmapData;
		}

		/// 对应的标识符
		public function get key() : Object
		{
			return m_key;
		}
		
		/// 获得位图占用的内存
		public function get memory() : uint
		{
			return m_bitmapData.width * m_bitmapData.height * 4;
		}
		
		public function toString() : String
		{
			var str : String = "[KTexture2D: key=" + key.toString() + " memory=" + memory + "]";
			return str;
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 实现 IKDispose 接口
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		/**
		 * 释放资源, 一般由 KTextureCache 类调用, 不建议用户手动调用.
		 */
		public function dispose() : void
		{
			if (m_isDisposed)
				return;
			m_isDisposed = true;
			
			m_bitmapData.dispose();
			m_bitmapData = null;
			
			m_key = null;
		}

///////////////////////////////////////////////////////////////////////////////////////////////////
// 私有域
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		private var m_isDisposed : Boolean = false;

		/// 位图数据
		private var m_bitmapData : BitmapData = null;
		
		/// 标识符
		private var m_key : Object = null;
		
	}

}